package com.mydomain.Bodega;

import static org.jboss.seam.ScopeType.SESSION;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.contexts.Context;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.security.Identity;


@Stateless
@Name("authenticator")
public class AuthenticatorAction implements Authenticator {
	
	@PersistenceContext
	private EntityManager em;

	@Out(required = false, scope = SESSION)
	private Usuario user;
	
	@In
	Identity identity;

	@In 
	Context sessionContext;
	
	public boolean authenticate() {
		long contar=0;
		Subdepartamento  subdepartamento;
		List results = em
				.createQuery(
						"select u from Usuario u where u.usuUssuario=#{identity.username} and u.usuClave=#{identity.password}")
				.getResultList();

		if (results.size() == 0) {
			return false;
		} else{
				user = (Usuario) results.get(0);
			 contar=(Long)em.createQuery(
							"select count(u.usuCodigo) from Usuario u join u.subdepartamentos s  where u.usuUssuario=#{identity.username} and u.usuClave=#{identity.password}")
					.getSingleResult();
				if (contar==0){
	                FacesMessages.instance().add("El usuario no tiene asignado un subdepartamento comuniquese con el administrador !!!");
	                return false;
				}else{
					subdepartamento=(Subdepartamento)em.createQuery(
					"select s from Usuario u join u.subdepartamentos s  where u.usuUssuario=#{identity.username} and u.usuClave=#{identity.password}")
			.getSingleResult();
				sessionContext.set("usuarioLogeo", subdepartamento);
				identity.addRole(subdepartamento.getUsuario().getTipoUsuario().getTipUsuNombre());
				Departamento varDepartamento=(Departamento)em.createQuery(
				"select d from Usuario u join u.subdepartamentos s join s.departamento d  where u.usuUssuario=#{identity.username} and u.usuClave=#{identity.password}")
		.getSingleResult();
				
				sessionContext.set("departamentoLogeo",varDepartamento);
				System.out.printf(varDepartamento.getDepDescripcion());
				
				System.out.println(""+subdepartamento.getUsuario().getTipoUsuario().getTipUsuNombre());
				}
			}
			System.out.println(user.getUsuCodigo());
			metodoRegistroDeAuditoria("INICIO_SESSION","INICIAR",em, subdepartamento);
			return true;
	}
	
	

	public void metodoRegistroDeAuditoria(String varOperacion, String  varPantalla,EntityManager em, Subdepartamento subdepartamento){
		
		try {
			Auditoria auditoria = new Auditoria();
			auditoria.setAudPantalla(varPantalla);
			auditoria.setAudOperacion(varOperacion);
			auditoria.setAudFecha((new Date()));
			auditoria.setAudCodigoDeTabla("");
			auditoria.setUsuario(subdepartamento.getUsuario());
			em.persist(auditoria);
			em.flush();
			
		} catch (Exception e) {
			// TODO: handle exception
		}

	}
				
	}



